package com.rentong.cust.service.impl;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.util.DateUtils;
import com.rentong.cust.domain.CustJiesuan;
import com.rentong.cust.domain.CustJiesuanVo;
import com.rentong.cust.mapper.CustJiesuanMapper;
import com.rentong.cust.utils.ReadExcel;
import com.rentong.cust.vo.CustJiesuanDto;
import com.rentong.cust.vo.CustJiesuanName;
import com.rentong.cust.vo.CustJiesuanRequest;
import com.rentong.cust.vo.SubmitRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.rentong.cust.mapper.CustJiesuanListMapper;
import com.rentong.cust.domain.CustJiesuanList;
import com.rentong.cust.service.ICustJiesuanListService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

/**
 * 结算单Service业务层处理
 *
 * @author ruoyi
 * @date 2025-01-02
 */
@Service
public class CustJiesuanListServiceImpl implements ICustJiesuanListService {
    @Autowired
    private CustJiesuanListMapper custJiesuanListMapper;

    @Autowired
    private CustJiesuanMapper custJiesuanMapper;

    /**
     * 查询结算单
     *
     * @param jiesuanListId 结算单主键
     * @return 结算单
     */
    @Override
    public CustJiesuanVo selectCustJiesuanListByJiesuanListId(Long jiesuanListId) {
        return custJiesuanListMapper.selectCustJiesuanListByJiesuanListId(jiesuanListId);
    }


    @Override
    public List<CustJiesuanVo> selectCustJiesuanListList(CustJiesuanRequest custJiesuanRequest) {
        return custJiesuanListMapper.selectCustJiesuanWithDetails(custJiesuanRequest);
    }

    /**
     * 新增结算单
     *
     * @param custJiesuanList 结算单
     * @return 结果
     */
    @Override
    public int insertCustJiesuanList(CustJiesuanList custJiesuanList) {
        return custJiesuanListMapper.insertCustJiesuanList(custJiesuanList);
    }

    /**
     * 修改结算单
     *
     * @param custJiesuanList 结算单
     * @return 结果
     */
    @Override
    public int updateCustJiesuanList(CustJiesuanList custJiesuanList) {
        return custJiesuanListMapper.updateCustJiesuanList(custJiesuanList);
    }

    /**
     * 批量删除结算单
     *
     * @param jiesuanListIds 需要删除的结算单主键
     * @return 结果
     */
    @Override
    @Transactional()
    public int deleteCustJiesuanListByJiesuanListIds(Long[] jiesuanListIds) {
        custJiesuanMapper.deleteCustJiesuanByJiesuanIds(jiesuanListIds);
        return custJiesuanListMapper.deleteCustJiesuanListByJiesuanListIds(jiesuanListIds);
    }

    /**
     * 删除结算单信息
     *
     * @param jiesuanListId 结算单主键
     * @return 结果
     */
    @Override
    public int deleteCustJiesuanListByJiesuanListId(Long jiesuanListId) {
        return custJiesuanListMapper.deleteCustJiesuanListByJiesuanListId(jiesuanListId);
    }

    @Override
    public void handleFileUpload(MultipartFile file) throws IOException {
        byte[] byteArr = file.getBytes();
        InputStream inputStream = new ByteArrayInputStream(byteArr);
        List<CustJiesuanDto> jiesuanDtos = ReadExcel.read(inputStream);

        for (CustJiesuanDto jiesuanDto : jiesuanDtos) {
            CustJiesuan custJiesuan = null;
            boolean isFirstEntry = true;

            for (CustJiesuanName custJiesuanName : jiesuanDto.getCustJiesuanNames()) {

                if (isFirstEntry) {
                    // 创建并设置 CustJiesuan 实例
                    custJiesuan = new CustJiesuan();
                    custJiesuan.setProjectName(custJiesuanName.getProjectName());
                    custJiesuan.setJiesuanState(1);
                    // 插入 CustJiesuan 记录
                    custJiesuanMapper.insertCustJiesuan(custJiesuan);
                    isFirstEntry = false; // 确保只插入一次
                }

                // 创建并设置 CustJiesuanList 实例
                CustJiesuanList custJiesuanList = new CustJiesuanList();
                custJiesuanList.setJiesuanId(custJiesuan.getJiesuanId());
                custJiesuanList.setJiesuanTime(DateUtil.parse(jiesuanDto.getJiesuanTime()));
                custJiesuanList.setJiesuanListName(custJiesuanName.getProjectName());
                custJiesuanList.setGongchengliang(custJiesuanName.getGongchengliang());
                custJiesuanList.setDanwei(custJiesuanName.getDanwei());

                // 插入 CustJiesuanList 记录
                custJiesuanListMapper.insertCustJiesuanList(custJiesuanList);
            }
        }

    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submit(SubmitRequest submitRequest) {
        if (ObjectUtil.isNotEmpty(submitRequest)) {
            custJiesuanMapper.submit(submitRequest.getJiesuanId());
        }

    }

    @Override
    public List<CustJiesuanVo> selectCustJiesuanListListByConfirm(CustJiesuanRequest custJiesuanRequest) {
        return custJiesuanListMapper.selectCustJiesuanWithDetailsByConfirm(custJiesuanRequest);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void confirmSubmit(SubmitRequest submitRequest) {
        if (ObjectUtil.isNotEmpty(submitRequest)) {
            custJiesuanMapper.confirmSubmit(submitRequest.getJiesuanId());
        }
    }

    @Override
    public void outConfirm(Long[] jiesuanListIds) {
        if (ObjectUtil.isNotEmpty(jiesuanListIds)){
            Long jiesuanListId = jiesuanListIds[0];
            custJiesuanMapper.outConfirm(jiesuanListId);
        }
    }
}
